#!/usr/bin/env python3
#coding=utf-8
import re

'''
由于正则在执行过程中被多次用于比较，强烈建议先对它做预编译，明显提升性能
re.compile就是用来提供此功能的

其实模块函数会对已编译对象进行缓存，所以不是所有使用相同正则的search和match
都需要编译

大多数re模块函数都可以作为regex对象的方法，如果需要编译就用方法，不需要就用函数
'''

def match_test():
	pattern = re.compile('world')
	p = pattern.match('world')
	# if p is not None:
	# 	print 'p:',p.group()

	# match尝试从开头进行匹配，成功就返回一个匹配对象，失败返回None
	# 匹配对象的group方法用来显示那个成功的匹配

	r = re.match(r'hello','hello,world')
	# 在实际编程中最好加上if，因为失败就没有group方法
	if r is not None:
		print 'r:',r.group()

	bt = 'bat|bet|bit'
	print re.match(bt,'bat').group()

	# 匹配单个字符
	anyend = '.end'
	print re.match(anyend,'bend').group()
	# 不能匹配换行符
	if re.match(anyend,'\nend') is None:
		print 'cannot match None'
	pi_patt = '3\.14' # 已转义成小数点
	print 'pi match:',re.match(pi_patt,'3.14').group()

	m = re.match(r'(\w+) (\w+)(?P<sign>.*)', 'hello world!')

	print "\nm.string:", m.string
	print "m.re:", m.re
	print "m.pos:", m.pos
	print "m.endpos:", m.endpos
	print "m.lastindex:", m.lastindex
	print "m.lastgroup:", m.lastgroup

	print "m.group():", m.group()
	print "m.group(1,2):", m.group(1, 2)
	print "m.groups():", m.groups()
	print "m.groupdict():", m.groupdict()
	print "m.start(2):", m.start(2)
	print "m.end(2):", m.end(2)
	print "m.span(2):", m.span(2)
	print r"m.expand(r'\g<2> \g<1>\g<3>'):", m.expand(r'\2 \1\3')
	print '\n'
	 
	### output ###
	# m.string: hello world!
	# m.re: <_sre.SRE_Pattern object at 0x016E1A38>
	# m.pos: 0
	# m.endpos: 12
	# m.lastindex: 3
	# m.lastgroup: sign
	# m.group(1,2): ('hello', 'world')
	# m.groups(): ('hello', 'world', '!')
	# m.groupdict(): {'sign': '!'}
	# m.start(2): 6
	# m.end(2): 11
	# m.span(2): (6, 11)
	# m.expand(r'\2 \1\3'): world hello!

def search_test():
	# search会检查字符串任意位置的匹配情况，而match是从头开始
	try:
		print re.match('foo','seafoo').group()
	except:
		print 'match not found foo'
	try:
		print re.search('foo','seafood').group()
	except:
		print 'search not found foo'


if __name__ == '__main__':
	#search_test()	
	match_test()
